﻿using System;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;
using System.Windows.Controls;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    public partial class ManutencaoOrdens : SinacorWindow, IManutencaoOrdens
    {
        #region Event Handlers

        private void DtgDetalhes_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                // Limpando style
                _style = string.Empty;

                // Verifica se quem disparou o evento foi uma linha
                if (e.OriginalSource is BaseRow)
                {
                    //Verifica estado ordem
                    this.PresenterManutencaoOrdens.VerificarEstadoDetalheOrdem(e.ItemInfo.Item as Model.DetalheOrdem);
                }

                // Retornando style
                e.Style = _style;
            }
        }

        private void DtgDetalhes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            btnPreBoletoFinanciamentoPOP.IsEnabled = (DtgDetalhes.SelectedItem != null);
        }

        /// <summary>
        /// Deleting event - DtgDetalhes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgDetalhes_Deleting(object sender, CancelItemsEventArgs e)
        {
            int index;

            if (e.OriginalSource is SinacorDataGrid)
            {
                //Mensagem de confirmação de cancelamento
                SinacorMessageBoxResult result = SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.Message.ConfirmaCancelamentoDetalheOrdem").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

                //Verifica se o cancelamento foi cancelado
                if (result != SinacorMessageBoxResult.Yes)
                    e.Cancel = true;
                else
                {
                    index = PresenterManutencaoOrdens.Ordens.IndexOf(PresenterManutencaoOrdens.OrdemAtual);
                    PresenterManutencaoOrdens.Ordens[index] = (Model.Ordem)Infra.Common.Serialization.CloneHelper.Clone(PresenterManutencaoOrdens.OrdemAtual);
                    dtgOrdens.SelectedValue = PresenterManutencaoOrdens.Ordens[index];

                    //Obtem saldo negociavel
                    PresenterManutencaoOrdens.ObterSaldoNegociavel(PresenterManutencaoOrdens.OrdemAtual, null);
                }
            }
        }

        private void DtgDetalhes_Deleted(object sender, ItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.CurrentModel.Detalhes = this.PresenterManutencaoOrdens.OrdemAtual.Detalhes;
                this.PresenterManutencaoOrdens.OrdemAtual = this.CurrentModel;
                PresenterManutencaoOrdens.IncluirJustificativa(this.PresenterManutencaoOrdens.OrdemAtual);
            }
        }

        /// <summary>
        /// InsertBegun event - dtgDetalhes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgDetalhes_InsertBegun(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.PresenterManutencaoOrdens.CarregarNaturezaOperacao();
                this.PresenterManutencaoOrdens.CarregarTipoMercadoDetalhe();
                ((SinacorComboBox)ControlHelper.FindChild(DtgDetalhes.GetEditRow(), "CmbMercado")).UpdateTarget(SinacorComboBox.ItemsSourceProperty);

                this.CurrentModelDetalhe.DataOrdem = this.CurrentModel.DataOrdem;
            }
        }

        private void DtgDetalhes_Inserting(object sender, CancelItemEventArgs e)
        {
            int index;

            if (e.OriginalSource is SinacorDataGrid)
            {
                index = PresenterManutencaoOrdens.Ordens.IndexOf(PresenterManutencaoOrdens.OrdemAtual);

                if (index != -1)
                {
                    PresenterManutencaoOrdens.Ordens[index] = (Model.Ordem)Infra.Common.Serialization.CloneHelper.Clone(PresenterManutencaoOrdens.OrdemAtual);
                    dtgOrdens.SelectedValue = PresenterManutencaoOrdens.Ordens[index];
                }
            }
        }

        /// <summary>
        /// EndingInsert event - DtgDetalhes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgDetalhes_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                Int16? carteira = this.PresenterManutencaoOrdens.ConfigurarCarteiraDetalheOrdem(this.CurrentModelDetalhe);
                if (carteira != null)
                {
                    this.CurrentModelDetalhe.Carteira = carteira;
                }

                this.CurrentModelDetalhe.NumeroOrdem = PresenterManutencaoOrdens.OrdemAtual.NumeroOrdem;
                this.CurrentModelDetalhe.NumeroOrdemSubSequencia = PresenterManutencaoOrdens.OrdemAtual.NumeroOrdemSubSequencia;
            }
        }

        /// <summary>
        /// InsertEnded event - DtgDetalhes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DtgDetalhes_InsertEnded(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                this.CurrentModel.Detalhes = this.PresenterManutencaoOrdens.OrdemAtual.Detalhes;
                this.PresenterManutencaoOrdens.OrdemAtual = this.CurrentModel;

                this.PresenterManutencaoOrdens.CalcularQuantidadeNegocio();

                PresenterManutencaoOrdens.IncluirJustificativa(this.PresenterManutencaoOrdens.OrdemAtual);
            }
        }

        /// <summary>
        /// Exibi tela de Pre-boleto
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPreBoletoFinanciamentoPOP_Click(object sender, RoutedEventArgs e)
        {
            this.ConsultarPreBoletos();
        }

        /// <summary>
        /// Validating event - TxtAtivo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtAtivo_Validating(object sender, ValidatingEventArgs e)
        {
            SinacorTextBox TxtAtivo = (SinacorTextBox)ControlHelper.FindChild(this.DtgDetalhes.GetEditRow(), "TxtAtivo");

            e.Result = ValidationResult.ValidResult;

            if (!String.IsNullOrEmpty(TxtAtivo.Text))
            {
                if (!this.PresenterManutencaoOrdens.ObterTitulo(TxtAtivo.Text))
                    e.Result = new ValidationResult(false, "Bovespa.ManutencaoOrdens.Message.AtivoNaoExiste");
            }
        }

        /// <summary>
        /// Validating event - TxtQuantidade
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtQuantidade_Validating(object sender, ValidatingEventArgs e)
        {
            SinacorDecimalTextBox TxtQuantidade = (SinacorDecimalTextBox)ControlHelper.FindChild(this.DtgDetalhes.GetEditRow(), "TxtQuantidade");

            if (!TxtQuantidade.Value.HasValue)
            {
                e.Result = new ValidationResult(false, "Bovespa.ManutencaoOrdens.Message.QuantidadeObrigatoria");
            }
            else if (TxtQuantidade.Value == 0)
            {
                e.Result = new ValidationResult(false, "Bovespa.ManutencaoOrdens.ExceptionMessage.QuantidadeInvalida");
            }
            else
            {
                e.Result = ValidationResult.ValidResult;
            }
        }

        /// <summary>
        /// Validating event - TxtPreco
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtPreco_Validating(object sender, ValidatingEventArgs e)
        {
            SinacorDecimalTextBox TxtPreco = (SinacorDecimalTextBox)ControlHelper.FindChild(this.DtgDetalhes.GetEditRow(), "TxtPreco");

            if ((!TxtPreco.Value.HasValue) || (TxtPreco.Value.HasValue && TxtPreco.Value == 0))
                e.Result = new ValidationResult(false, "Bovespa.ManutencaoOrdens.ExceptionMessage.PrecoObrigatorio");
            else
                e.Result = ValidationResult.ValidResult;
        }

        /// <summary>
        /// Validating event - TxtVencimentoTermo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtVencimentoTermo_Validating(object sender, ValidatingEventArgs e)
        {
            SinacorInt32TextBox TxtVencimentoTermo = (SinacorInt32TextBox)ControlHelper.FindChild(this.DtgDetalhes.GetEditRow(), "TxtVencimentoTermo");

            if (this.CurrentModelDetalhe.Mercado == Sinacor.UI.Bovespa.ManutencaoOrdens.Model.Enum.TipoMercado.Termo &&
                (!TxtVencimentoTermo.Value.HasValue || (TxtVencimentoTermo.Value.HasValue && TxtVencimentoTermo.Value == 0)))
            {
                e.Result = new ValidationResult(false, "Bovespa.Ordens.ExceptionMessage.VencimentoTermoInvalido");
            }
            else
            {
                e.Result = ValidationResult.ValidResult;
            }
        }

        #endregion
    }
}
